package co.gov.medellin.ssti.sub.web.action;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.beans.factory.annotation.Autowired;

import co.gov.medellin.ssti.sub.common.excepcion.SUBException;
import co.gov.medellin.ssti.sub.common.util.Utility;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.service.ReporteTotalGrupoFamiliarService;
import co.gov.medellin.ssti.sub.model.vo.CondicionConsultaVO;
import co.gov.medellin.ssti.sub.model.vo.ReporteGrupoFamiliarVO;
import co.gov.medellin.ssti.sub.model.vo.ReporteTotalGrupoFamiliarVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;

public class TotalReportGenerationRGFAction extends Action {
	@Autowired
	ReporteTotalGrupoFamiliarService reporteTotalGrupoFamiliarServiceImpl;

	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 * @return
	 * @throws java.io.IOException
	 * @throws javax.servlet.ServletException
	 */
	@SuppressWarnings("unchecked")
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		HttpSession session = request.getSession();

		UserVO user = (UserVO) session.getAttribute("userInfo");

		Collection<ReporteTotalGrupoFamiliarVO> coReporte = null;
		Collection<SubprogramaVO> coProgSubprog = null;
		List<CondicionConsultaVO> lListFilters = new LinkedList<CondicionConsultaVO>();
		lListFilters = (List<CondicionConsultaVO>) session
				.getAttribute("ListFiltrado");

		String strCodeZona = (String) session.getAttribute("CodeZona");
		String strCodeComuna = (String) session.getAttribute("CodeComuna");
		String strCodeBarrio = (String) session.getAttribute("CodeBarrio");
		String strCodePrograma = (String) session.getAttribute("CodePrograma");
		String strCodeSubPrograma = (String) session
				.getAttribute("CodeSubPrograma");
		String strCodesProgramas = null;
		String strCodesSubprogramas = null;
		String strProgramaAnterior = "";
		String strCodeProg = "";

		ReporteGrupoFamiliarVO objReportGrupoVO = null;

		boolean continuar = true;

		// fecha inicial
		String fechaini = (request.getParameter("fechaInicial") == null) ? ""
				: request.getParameter("fechaInicial");
		String fechafinal = (request.getParameter("fechaFinal") == null) ? ""
				: request.getParameter("fechaFinal");

		// validar fechas.
		if (!fechaini.equals("") && !fechafinal.equals("")) {
			if (!Utility.isDateValid(fechaini)) {
				request.setAttribute("errorfecha",
						"La fecha inicial es incorrecta");
				continuar = false;
			} else if (!Utility.isDateValid(fechafinal)) {
				request.setAttribute("errorfecha",
						"La fecha final es incorrecta");
				continuar = false;
			} else {
				Date fIni;
				Date fFin;
				try {
					fIni = new SimpleDateFormat(Utility.DATE_FORMAT)
							.parse(fechaini);
					fFin = new SimpleDateFormat(Utility.DATE_FORMAT)
							.parse(fechafinal);
					if (fIni.after(fFin)) {
						request.setAttribute("errorfecha",
								"La fecha inicial es mayor a la final");
						continuar = false;
					}
				} catch (ParseException e) {
					continuar = false;
				}
			}
		}

		if (continuar) {
			try {
				// Proceso para obtener los criterios de busqueda
				objReportGrupoVO = new ReporteGrupoFamiliarVO();
				if (strCodeZona != null) {
					objReportGrupoVO.setCodeZona(new Long(strCodeZona));
				}
				if (strCodeComuna != null) {
					objReportGrupoVO.setCodeComuna(new Long(strCodeComuna));
				}
				if (strCodeBarrio != null) {
					objReportGrupoVO.setCodeBarrio(new Long(strCodeBarrio));
				}
				if (fechaini != "")
					objReportGrupoVO.setDesde(fechaini);
				if (fechafinal != "")
					objReportGrupoVO.setHasta(fechafinal);

				if (strCodePrograma == null || strCodeSubPrograma == null) {
					// Proceso para traer los programas y beneficios de acurdo
					// al
					// usuario
					coProgSubprog = reporteTotalGrupoFamiliarServiceImpl
							.findProgSubprog(user.getCode(),
									user.getUserGroupName(), user.getCodeArea());
					// Fin del proceso

					String strCodeMaxProg = null;
					if (coProgSubprog != null && coProgSubprog.size() != 0) {
						List<SubprogramaVO> listProgSubprog = (List<SubprogramaVO>) coProgSubprog;
						SubprogramaVO objSubProgVO = (SubprogramaVO) listProgSubprog
								.get((coProgSubprog.size() - 1));
						strCodeMaxProg = objSubProgVO.getCodePrograma() + "";
					}

					if (coProgSubprog != null && coProgSubprog.size() != 0) {
						List<SubprogramaVO> lProgSubprog = (List<SubprogramaVO>) coProgSubprog;
						SubprogramaVO subpro = new SubprogramaVO();
						for (int i = 0; i < lProgSubprog.size(); i++) {
							subpro = (SubprogramaVO) lProgSubprog.get(i);
							if (strCodesProgramas != null) {
								if (i != (lProgSubprog.size()) - 1) {
									strCodeProg = subpro.getCodePrograma() + "";
									if (!strProgramaAnterior
											.equals(strCodeProg)) {
										String strCodeProgAct = subpro
												.getCodePrograma() + "";
										if (!strCodeProgAct
												.equals(strCodeMaxProg)) {
											strCodesProgramas += subpro
													.getCodePrograma() + ",";
											strProgramaAnterior = subpro
													.getCodePrograma() + "";
										} else {
											strCodesProgramas += subpro
													.getCodePrograma() + "";
											strProgramaAnterior = subpro
													.getCodePrograma() + "";
										}
									}
									strCodesSubprogramas += subpro
											.getCodeSubPrograma() + ",";
								} else {
									strCodeProg = subpro.getCodePrograma() + "";
									if (!strProgramaAnterior
											.equals(strCodeProg)) {
										strCodesProgramas += subpro
												.getCodePrograma() + "";
										strProgramaAnterior = subpro
												.getCodePrograma() + "";
									}
									strCodesSubprogramas += subpro
											.getCodeSubPrograma();
								}
							} else {
								if (i != (lProgSubprog.size()) - 1) {
									strCodeProg = subpro.getCodePrograma() + "";
									if (!strProgramaAnterior
											.equals(strCodeProg)) {
										strCodesProgramas = subpro
												.getCodePrograma() + ",";
										strProgramaAnterior = subpro
												.getCodePrograma() + "";
									}
									strCodesSubprogramas = subpro
											.getCodeSubPrograma() + ",";
								} else {
									strCodeProg = subpro.getCodePrograma() + "";
									if (!strProgramaAnterior
											.equals(strCodeProg)) {
										strCodesProgramas = subpro
												.getCodePrograma() + "";
										strProgramaAnterior = subpro
												.getCodePrograma() + "";
									}
									strCodesSubprogramas = subpro
											.getCodeSubPrograma();
								}
							}
						}
					}
				}
				if (strCodePrograma == null)
					objReportGrupoVO.setCodesProgramas(strCodesProgramas);
				else
					objReportGrupoVO.setCodePrograma(new Long(strCodePrograma));

				if (strCodePrograma == null && strCodeSubPrograma == null)
					objReportGrupoVO.setCodesSubprogramas(strCodesSubprogramas);
				else {
					if (strCodeSubPrograma != null)
						objReportGrupoVO.setCodeSubprograma(new Long(
								strCodeSubPrograma));
					else
						objReportGrupoVO
								.setCodesSubprogramas(strCodesSubprogramas);
				}

				// Fin del proceso

				// Proceso para obtener la informacion del reporte

				objReportGrupoVO = reporteTotalGrupoFamiliarServiceImpl
						.findFilters(objReportGrupoVO);
				coReporte = reporteTotalGrupoFamiliarServiceImpl
						.findTotalReportGrupoFamiliar(objReportGrupoVO,
								lListFilters);
				// Fin del proceso

			} catch (DAOException e) {
				SUBException.logDebugError("", e);
			}

			if (coReporte != null && coReporte.size() != 0) {
				session.setAttribute("ListReportGrupoFam", coReporte);
				session.setAttribute("Filters", objReportGrupoVO);
			} else {
				request.setAttribute("msgerror",
						"No hay registros que cumplan con las condiciones seleccionadas");
			}
		}
		return mapping.findForward("success");
	}
}